﻿
namespace Mbs.Modularity
{
    /// <summary>
    /// 模块接口
    /// </summary>
    /// <remarks>
    /// 模块和插件是一个意思。
    /// 一个模块或插件可以最多拥有一个插件配置文件配置文件的规则是：如果一个模块的dll是ModuleA.dll,那么它的配置文件
    /// 必须是ModuleA.dll.AddIn。
    /// 每个模块或插件必须有一个对应的模块激活器（<see cref="IModuleActivator"/>来启动
    /// </remarks>
    public interface IModule:IKey<int>,IStartable
    {
        /// <summary>
        /// 得到插件状态
        /// </summary>
        ModuleState State { get; }

        /// <summary>
        /// 得到插件元数据
        /// </summary>
        IModuleMeta Meta { get; }
        
        ///// <summary>
        ///// 得到插件的ClassLoader
        ///// </summary>
        ///// <remarks>
        ///// 如果该插件运行在一个独立的AppDomain，那么该插件就拥有独立的<see cref="IClassLoader"/>
        ///// 否则共享全局的<see cref="IClassLoader"/>
        ///// </remarks>
        //IClassLoader ClassLoader { get; }

        ///// <summary>
        ///// 得到插件的服务定位器
        ///// </summary>
        ///// <remarks>
        ///// 如果该插件运行在一个独立的<see cref="IClassLoader"/>，那么该插件就拥有独立的服务定位器
        ///// 否则共享全局的服务定位器
        ///// </remarks>
        //IServiceLocator Locator { get; }

        /// <summary>
        /// 卸载插件
        /// </summary>
        void Uninstall();
    }
}
